﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Gustozzi.BL;
using Gustozzi.DAL;
using System.Text;
namespace WebGustozzi.ModuloVentas
{
    public partial class wfGenerarPedidoVenta : System.Web.UI.Page
    {
        VentasDataEntities contexto = null;
        string codSucursal = string.Empty;
        Pedido oPedido = null;
        Cliente oCliente = null;
        List<PedidoItem> listaPedidos = null;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Inicializar();
                hdf_InicioGrilla.Value = "S";
                Session["numSelProd"] = "0";
            }
            else
            {
                hdf_InicioGrilla.Value = "N";
            }
        }

        protected void imbCancelar_Click(object sender, ImageClickEventArgs e)
        {
            Response.Redirect("../wfPrincipal.aspx");
        }

        public void Inicializar()
        {
            if (contexto == null)
            {
                contexto = new VentasDataEntities();
            }
            codSucursal = "010";
            NuevoRegistro();
        }

        protected void btnAgregaProducto_Click(object sender, EventArgs e)
        {
            Response.Redirect("wfAgregarProducto.aspx");

        }

        protected void imbGuardar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                GuardarPedido();
            }
            catch (Exception)
            {

                throw;
            }
        }

        protected void Button4_Click(object sender, EventArgs e)
        {
            Response.Redirect("../wfPrincipal.aspx");
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            NuevoRegistro();
        }

        public void NuevoRegistro()
        {
            if (contexto == null)
            {
                contexto = new VentasDataEntities();
            }

            var resultado = from v in contexto.Vendedores.Include("Empleado")
                            select new { NombreVendedor = v.Empleado.apellidoPaterno + " " + v.Empleado.apellidoMaterno + ", " + v.Empleado.nombre, v.codigoVendedor };

            ddlVendedor.DataSource = resultado;
            ddlVendedor.DataValueField = "codigoVendedor";
            ddlVendedor.DataTextField = "NombreVendedor";
            ddlVendedor.DataBind();

            List<string> numeroPedido = contexto.ObtenerNumeroPedido(codSucursal).ToList();
            if (numeroPedido != null)
            {
                if (numeroPedido.Count > 0)
                {
                    txtNroPedido.Text = numeroPedido[0];
                }
            }

            var resultadoIGV = (from i in contexto.ListadoIGV
                                where i.estado == 1
                                select i.porcentaje).ToList();

            txtIGV.Text = "--NC--";
            if (resultadoIGV != null)
            {
                if (resultadoIGV.Count > 0)
                {
                    txtIGV.Text = resultadoIGV[0].Value.ToString();
                }
            }

            var resultadoTipoPago = (from p in contexto.TiposCondicionesPago
                                     select p);

            ddlFormaPago.DataSource = resultadoTipoPago;
            ddlFormaPago.DataValueField = "codigoCondicionPago";
            ddlFormaPago.DataTextField = "descripcion";
            ddlFormaPago.DataBind();


            List<string> listaEstados = new List<string>();
            listaEstados.Add(PedidoBL.cPedido_Pendiente);
            listaEstados.Add(PedidoBL.cPedido_Facturado);
            listaEstados.Add(PedidoBL.cPedido_Observado);
            listaEstados.Add(PedidoBL.cPedido_Anulado);

            ddlEstado.DataSource = listaEstados;
            ddlEstado.DataBind();

            txtFechaEmision.Text = DateTime.Now.ToShortDateString();
            txtFechaEntrega.Text = DateTime.Now.ToShortDateString();
            txtFechaPago.Text = DateTime.Now.ToShortDateString();
        }


        protected void btnAgregaCliente_Click1(object sender, EventArgs e)
        {
            Response.Redirect("wfConsultarCliente.aspx");
        }

        protected void txtCodCliente_TextChanged(object sender, EventArgs e)
        {
            ConsultarCliente();
        }

        public void ConsultarCliente()
        {
            if (contexto == null)
            {
                contexto = new VentasDataEntities();
            }
            int idCliente = 0;
            if (!txtCodCliente.Text.Trim().Equals(string.Empty))
            {
                idCliente = Convert.ToInt32(txtCodCliente.Text.Trim());
            }
            var lstClienteBusq = (from c in contexto.Clientes
                                  where c.codigoCliente == idCliente
                                  select c);

            Cliente oCliente = null;
            if (lstClienteBusq.Count() > 0)
            {
                oCliente = (Cliente)lstClienteBusq.First();
            }

            if (oCliente != null)
            {
                txtNomCliente.Text = oCliente.apellidoPaternoCliente + ' ' + oCliente.apellidoMaternoCliente + ',' +
                    oCliente.nombreCliente;
                txtNroDoc.Text = oCliente.numeroDocumento;
                TipoDocumentoPersona tipoDoc = (from td in contexto.TiposDocumentosPersona
                                                where td.codigoTipoDocumentoPersona == oCliente.codigoTipoDocumentoPersona
                                                select td).First();

                txtTipDoc.Text = tipoDoc.nombre;
            }
        }

        protected void grvDireccion_SelectedIndexChanged(object sender, EventArgs e)
        {
            string s;
            s = e.ToString();
        }

        protected void hdfNumItems_ValueChanged(object sender, EventArgs e)
        {
            try
            {
                CargarDetallePedido();
            }
            catch (Exception)
            {

                throw;
            }

        }

        protected void txtNroPedido_TextChanged(object sender, EventArgs e)
        {
            try
            {
                CargarDatosPedido();
            }
            catch (Exception)
            {

                throw;
            }
        }

        public void CargarDetallePedido()
        {
            if (Session["listaProductos"] != null)
            {
                List<ItemPedido> listaProductos = (List<ItemPedido>)Session["listaProductos"];
                grvListaProductos.DataSource = null;
                grvListaProductos.DataSource = listaProductos;
                grvListaProductos.DataBind();
            }
        }
        public void BuscarPedido()
        {
            if (contexto == null)
            {
                contexto = new VentasDataEntities();
            }
            oPedido = (Pedido)(from p in contexto.Pedidos
                               where p.nroPedido == txtNroPedido.Text
                               select p).First();
            if (oPedido != null)
            {
                Cliente oCliente = (from c in contexto.Clientes
                                    where c.codigoCliente == oPedido.codigoCliente
                                    select c).First();

                listaPedidos = (List<PedidoItem>)(from p in contexto.PedidoItems.Include("Producto")
                                                  where p.codigoPedido == oPedido.codigoPedido
                                                  select p).ToList();

            }

        }
        public void CargarDatosPedido()
        {
            BuscarPedido();

            if (oPedido != null)
            {
                ddlVendedor.SelectedValue = oPedido.codigoVendedor.ToString();
                txtFechaEmision.Text = oPedido.fechaColocacion.Value.ToShortDateString();
                txtCodCliente.Text = oPedido.codigoCliente.ToString();
                ddlFormaPago.SelectedValue = oPedido.codigoCondicionPago.ToString();
                txtFechaPago.Text = oPedido.fechaPago.Value.ToShortDateString();
                txtFechaEntrega.Text = oPedido.fechaPactadaEntrega.Value.ToShortDateString();
                ddlEstado.SelectedValue = oPedido.estado;
                txtObservaciones.Text = oPedido.observaciones;

                ConsultarCliente();

                Session["listaProductos"] = null;
                grvListaProductos.DataSource = null;

                if (listaPedidos != null)
                {
                    List<ItemPedido> listaProductos = new List<ItemPedido>();
                    foreach (var item in listaPedidos)
                    {
                        ItemPedido oItemPedido = new ItemPedido();
                        oItemPedido.cantidad = (double)item.cantidad;
                        oItemPedido.codigoPedido = item.codigoPedido;
                        oItemPedido.codigoPedidoDetalle = item.codigoPedidoDetalle;
                        oItemPedido.codigoProducto = (int)item.codigoProducto;
                        if (item.codigoPromocion != null)
                        {
                            oItemPedido.codigoPromocion = (int)item.codigoPromocion;
                        }
                        oItemPedido.importe = (double)item.importe;
                        oItemPedido.nombreProducto = item.Producto.descripcion;
                        oItemPedido.precioUnitario = (double)item.precioUnitario;
                        var uMedida = (from u in contexto.UnidadesMedida
                                       where u.codigoUnidMedida == item.Producto.codigoUnidMedida
                                       select u).First();
                        oItemPedido.unidadMedida = uMedida.descripcion;
                        listaProductos.Add(oItemPedido);
                    }
                    Session["listaProductos"] = listaProductos;
                    hdfNumItems.Value = "-1";

                    CargarDetallePedido();
                }


            }

        }

        public void GuardarPedido()
        {
            oPedido = new Pedido();

            if (!hdfIdPedido.Value.Trim().Equals(string.Empty))
            {
                BuscarPedido();
                oPedido.codigoPedido = Convert.ToInt32(hdfIdPedido.Value);
            }

            int idCliente = Convert.ToInt32(txtCodCliente.Text.Trim());
            string idVendedor = ddlVendedor.SelectedValue;

            oPedido.codigoCliente = idCliente;
            oPedido.codigoVendedor = Convert.ToInt32(idVendedor);
            oPedido.fechaColocacion = Convert.ToDateTime(txtFechaEmision.Text);
            oPedido.fechaPago = Convert.ToDateTime(txtFechaPago.Text);
            oPedido.observaciones = txtObservaciones.Text;
            oPedido.codigoCondicionPago = Convert.ToInt32(ddlFormaPago.SelectedValue);

            double igv = Convert.ToDouble(txtIGV.Text);

            oPedido.datosDespacho = txtDireccion.Text;

            oPedido.nroPedido = txtNroPedido.Text;
            oPedido.estado = PedidoBL.cPedido_Pendiente;
            oPedido.fechaPactadaEntrega = Convert.ToDateTime(txtFechaEntrega.Text);

            List<ItemPedido> lstItemsPedido = (List<ItemPedido>)Session["listaProductos"];

            if (lstItemsPedido != null)
            {
                PedidoBL oPedidoBL = new PedidoBL();
                oPedidoBL.ActualizaPedido(oPedido, lstItemsPedido, igv);
                hdfIdPedido.Value = oPedido.codigoPedido.ToString();
            }
        }

        protected void grvListaProductos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (hdf_InicioGrilla.Value == "N")
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    e.Row.Attributes["OnClick"] = Page.ClientScript.GetPostBackClientHyperlink(this.grvListaProductos, "Select$" + e.Row.RowIndex.ToString());

                }
            }
        }

        protected void grvListaProductos_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                if (e.RowIndex >= 0)
                {
                    List<ItemPedido> lstItemsPedido = (List<ItemPedido>)Session["listaProductos"];
                    lstItemsPedido.RemoveAt(e.RowIndex);
                    Session["listaProductos"] = lstItemsPedido;
                    CargarDetallePedido();
                }


            }
            catch (Exception)
            {

                throw;
            }
        }

        protected void btnModificar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ddlEstado.SelectedValue == PedidoBL.cPedido_Pendiente ||
                    ddlEstado.SelectedValue == PedidoBL.cPedido_Observado)
                {
                    //habilitar campos de edicion
                }
                else
                {
                    //mostrar mensaje de que no se pueden modificar
                }
            }
            catch (Exception)
            {

                throw;
            }
        }

        protected void btnAnular_Click(object sender, EventArgs e)
        {
            if (ddlEstado.SelectedValue == PedidoBL.cPedido_Anulado)
            {
                //mostrar mensaje de error que no se puede anular un doc ya anulado
            }
            else
            {
                AnularPedido();
            }
        }
        public void AnularPedido()
        {
            PedidoBL oPedidoBL = new PedidoBL();
            int idPedido = 0;
            if (!hdfIdPedido.Value.Trim().Equals(String.Empty))
            {
                oPedidoBL.anulaPedido(idPedido);
            }
            else
            {
                //mostrar mensaje de error
            }
        }




    }

}
